 1.ZooKeeper数据模型Znode
   
   在ZooKeeper中，数据信息被保存在⼀一个个数据节点上，这些节点被称为znode。ZNode 是
Zookeeper 中最小数据单位，在 ZNode 下面又可以再挂 ZNode，这样⼀一层层下去就形成了一个层次化
命名空间 ZNode 树，我们称为 ZNode Tree，它采⽤用了了类似⽂文件系统的层级树状结构进⾏行行管理
   在 Zookeeper 中，每⼀一个数据节点都是⼀一个 ZNode，上图根⽬目录下有两个节点，分别是：app1 和
app2，其中 app1 下⾯面⼜又有三个⼦子节点,所有ZNode按层次化进⾏行行组织，形成这么⼀一颗树，ZNode的节
点路径标识方式和Unix⽂文件系统路路径⾮非常相似，都是由一系列列使⽤用斜杠(/)进行分割的路径表示，开
发⼈人员可以向这个节点写⼊入数据，也可以在这个节点下⾯面创建⼦子节点。
 
 2.ZNode的类型
   
   刚刚已经了了解到，Zookeeper的znode tree是由一系列数据节点组成的，那接下来，我们就对数据节点
做详细讲解
   Zookeeper 节点类型可以分为三大类：
   持久性节点（Persistent）
   临时性节点（Ephemeral）
   顺序性节点（Sequential）
   在开发中在创建节点的时候通过组合可以⽣生成以下四种节点类型：持久节点、持久顺序节点、临时节
点、临时顺序节点。不不同类型的节点则会有不不同的⽣生命周期
   持久节点：是Zookeeper中最常见的一种节点类型，所谓持久节点，就是指节点被创建后会一直存在服
务器器，直到删除操作主动清除
   持久顺序节点：就是有顺序的持久节点，节点特性和持久节点是⼀一样的，只是额外特性表现在顺序上。
顺序特性实质是在创建节点的时候，会在节点名后⾯面加上⼀一个数字后缀，来表示其顺序。
   临时节点：就是会被自动清理掉的节点，它的生命周期和客户端会话绑在一起，客户端会话结束，节点
会被删除掉。与持久性节点不不同的是，临时节点不不能创建⼦子节点
   临时顺序节点：就是有顺序的临时节点，和持久顺序节点相同，在其创建的时候会在名字后面加上数字
后缀。
 
 3.事务ID
   
   首先，先了解，事务是对物理和抽象的应用状态上的操作集合。往往在现在的概念中，狭义上的事务通
常指的是数据库事务，一般包含了一系列列对数据库有序的读写操作，这些数据库事务具有所谓的ACID特
性，即原子性（Atomic）、一致性（Consistency）、隔离性（Isolation）和持久性（Durability）。
   而在ZooKeeper中，事务是指能够改变ZooKeeper服务器器状态的操作，我们也称之为事务操作或更新
操作，一般包括数据节点创建与删除、数据节点内容更更新等操作。对于每⼀一个事务请求，ZooKeeper都
会为其分配一个全局唯一的事务ID，用 ZXID 来表示，通常是一个64位的数字。每一个 ZXID 对应一次
更新操作，从这些ZXID中可以间接地识别出ZooKeeper处理理这些更更新操作请求的全局顺序
   zk中的事务指的是对zk服务器状态改变的操作(create,update data,更新字节点)；zk对这些事务操作都
会编号，这个编号是⾃自增⻓长的被称为ZXID。
 
 4.ZNode的状态信息
   
   #使用bin/zkCli.sh 连接到zk集群
   [zk: localhost:2181(CONNECTED) 2] get /zookeeper
   cZxid = 0x0
   ctime = Wed Dec 31 19:00:00 EST 1969
   mZxid = 0x0
   mtime = Wed Dec 31 19:00:00 EST 1969
   pZxid = 0x0
   cversion = -1
   dataVersion = 0
   aclVersion = 0
   ephemeralOwner = 0x0
   dataLength = 0
   numChildren = 1
   整个 ZNode 节点内容包括两部分：节点数据内容和节点状态信息。数据内容是空，其他的属于状态信
息。那么这些状态信息都有什么含义呢？
   cZxid 就是 Create ZXID，表示节点被创建时的事务ID。
   ctime 就是 Create Time，表示节点创建时间。
   mZxid 就是 Modified ZXID，表示节点最后一次被修改时的事务ID。
   mtime 就是 Modified Time，表示节点最后一次被修改的时间。
   pZxid 表示该节点的子节点列表最后一次被修改时的事务 ID。只有子节点列表变更才会更新 pZxid，
子节点内容变更不会更新。
   cversion 表示子节点的版本号。
   dataVersion 表示内容版本号。
   aclVersion 标识acl版本
   ephemeralOwner 表示创建该临时节点时的会话 sessionID，如果是持久性节点那么值为 0
   dataLength 表示数据长度。
   numChildren 表示直系子节点数。